package com.congee02.spring.core;

public abstract class NestedExceptionUtils {


	/**
	 * 为给定的基本消息和根本原因构建一条消息。
	 * @param message 基本信息
	 * @param cause 根本原因
	 * @return	完整的异常信息
	 */
	public static String buildMessage(String message, Throwable cause) {
		if (cause == null) {
			return message;
		}
		StringBuilder sb = new StringBuilder(64);
		if (message != null) {
			sb.append(message).append("; ");
		}
		sb.append("nested exception is ").append(cause);
		return sb.toString();
	}

	/**
	 * 检索给定异常的最内在原因（如果有）。
	 * @param original	原本的 Throwable
	 * @return	最根本的异常，如果没有则为 {@code null}
	 */
	public static Throwable getRootCause(Throwable original) {
		if (original == null) {
			return null;
		}
		Throwable rootCause = null;
		Throwable cause = original.getCause();

		// 向上遍历至顶
		while (cause != null && cause != rootCause) {
			rootCause = cause;
			cause = cause.getCause();
		}

		return rootCause;
	}



}